package cn.han.reflection;


import org.junit.Test;

import java.lang.reflect.Method;
import java.lang.reflect.TypeVariable;
import java.util.Arrays;

//本类用于反射的测试
public class TestReflect {
    /*单元测试方法：是java中最小的测试单位，使用灵活
    * 语法要求：@Test + public + void + 没有参数
    * 注意：使用时需要导包：Add JUnit 4 library to the build path
    * 导包后的效果：import org.junit.Test
    * 执行方式：选中方法名前面绿色的小三角
    * */
    //通过单元测试方法获取类的字节码对象
    @Test
    public void getClazz() throws ClassNotFoundException {
        //此方法的参数是类的全路径名：包名、类名注意抛出异常
        Class<?> clazz = Class.forName("cn.han.reflection.Student");
        Class<?> clazz2 = Student.class;
        Class<?> clazz3 = new Student().getClass();
        System.out.println(clazz);//打印的是刚刚反射获取到的字节码对象
        System.out.println(clazz2.getName());//打印的是当前字节码对象的全路径名
        System.out.println(clazz3.getSimpleName());//只获取类名
        System.out.println(clazz.getPackage());//获取的是包对象
        System.out.println(clazz.getPackage().getName());//根据获取到的包对象，获取包的名字

    }
    //通过单元测试方法获取Student类中的方法
    @Test
    public void getFunction() throws ClassNotFoundException {
        Class<?> clazz = Class.forName("cn.han.reflection.Student");
        Method[] ms = clazz.getMethods();
        System.out.println(ms);
        System.out.println(Arrays.toString(ms ));
        for (Method m :
                ms) {
            System.out.println(m.getName());
            TypeVariable<Method>[] types = m.getTypeParameters();
            System.out.println(Arrays.toString(types));
        }
    }

}
